#ifndef VIDEOWIDGET_H
#define VIDEOWIDGET_H

#include "ffmpegdecode.h"
#include "recvavpacket.h"
#include "RingBuffer.h"
#include <QWidget>
#include <QThread>
#include <memory>
#include <QLabel>

using std::shared_ptr;

class VideoWidget : public QWidget
{
    Q_OBJECT

public:
    VideoWidget(QWidget *parent = nullptr);
    ~VideoWidget();

    void paintEvent(QPaintEvent *event) override;

    QString getUrl();

    void setLabelVisible(bool flag);


signals:
    void clicked(const QString &videoUrl);

     void recordinfo(const QString &time, const QString &msg);

protected:
    void mousePressEvent(QMouseEvent *event) override;

public slots:
    // 当右上角设备列表中的某个通道被拖拽到该窗口时，触发该槽函数
    void handleDrag(const QString &url);
    // 当解码线程初始化解码器后，触发该槽函数
    void handleInitCodecFinished();
    // 当解码线程处理完一帧数据后，触发该槽函数
    void handleGetOneFrame(QImage img);
    // 当收包线程计算出一段时间内的平均码率后，触发该槽函数
    void handleUpdateBitRate(double bitRate);
    // 当用户要求关闭当前窗口播放时，触发该槽函数
    void stopPlay();

private:
    QString extractHttpUrlFromRtmp(const QString &rtmpUrl);

private:
    QString _url; // 对应的RTMP实时流url
    FFmpegDecode *_pFFmpegDecode;
    RecvAVPacket *_pRecvAVPacket;
    QThread *_pDecodeThread;
    QThread *_pRecvPktThread;
    shared_ptr<RingBuffer> _pSharedBuffer; // 播放窗口内部收包线程和解码线程共享的环形缓冲区
    QImage _image; // 当前窗口此刻要显示的画面
    QLabel _label;
};
#endif // VIDEOWIDGET_H
